<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class DogeAddress implements Rule
{
    // 主网地址前缀
    const MAINNET_PREFIX = 'D';

    // 测试网地址前缀
    const TESTNET_PREFIXES = ['n', '2'];

    public function passes($attribute, $value)
    {
        // 基础检查：非空字符串
        if (!is_string($value)) {
            return false;
        }

        // 检查地址长度（通常为34字符）
        if (strlen($value) < 26 || strlen($value) > 34) {
            return false;
        }

        // 检查前缀
        $firstChar = substr($value, 0, 1);

        // 主网地址检查
        if ($firstChar === self::MAINNET_PREFIX) {
            return $this->validateBase58($value);
        }

        // 测试网地址检查
        if (in_array($firstChar, self::TESTNET_PREFIXES)) {
            return $this->validateBase58($value);
        }

        return false;
    }

    /**
     * 验证Base58编码（排除易混淆字符 0/O/I/l）
     */
    protected function validateBase58(string $address): bool
    {
        return !preg_match('/[0OIl]/', $address);
    }

    public function message()
    {
        return '无效的Dogecoin地址格式';
    }
}
